<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>

<script>

    // 解析:
    // 方法1: 存储到全局对象 => 方法属于全局的 => 和Cat没有关系 => 不好
    // 方法2: 存储在构造函数Cat上 => 函数也是一个特殊的对象 => 存储属性和方法 
    //        存储在构造函数的那个属性中 prototype(原型)

    function Cat(name, col, callback) {
        this.name = name
        this.col = col
        this.callback = callback || function () { console.log(this.name + '是一只' + this.col + '颜色的小猫咪哦') }
    }
    console.dir(Cat)
    //存放公共代码段
    Cat.prototype.say = function () { console.log('喵喵~~~') }
    Cat.prototype.call = function () { console.log('wo~我的天哪~~') }
    Cat.prototype.callback = function () { console.log('nothing') }

    // 实例化对象访问属性和方法的机制:
    // 1. 实例化对象自己有先找自己的
    // 2. 自己没有 => 则找构造函数的原型对象(Cat.prototype)
    var Tom = new Cat('Tom', 'blue', function () { console.log('nonono') })
    var Jerry = new Cat('Jerry', 'blue')
    console.log(Tom, Jerry)


    Tom.say()
    Tom.callback()
    Jerry.callback()
    console.log()

    
</script>

</html>